var websocket = null;
var isConnect = false;
var initConfig = null;
const heartBeat = "";
var reconnectTimer = null;
//心跳设置
var heartCheck = {
  timeout: 20000, //每段时间发送一次心跳包 这里设置为20s
  timeoutObj: null, //延时发送消息对象（启动心跳新建这个对象，收到消息后重置对象）
  start: function () {
    this.timeoutObj = setTimeout(function () {
      if (isConnect) websocket.send(heartBeat);
    }, this.timeout);
  },
  reset: function () {
    clearTimeout(this.timeoutObj);
    this.start();
  },
  stop: function () {
    clearTimeout(this.timeoutObj);
  },
};
function initWebSocket() {
  websocket = new WebSocket(initConfig.server);
  websocket.onclose = websocketClose;
  websocket.onopen = websocketOpen;
  websocket.onerror = websocketOnerror;
  websocket.onmessage = websocketOnmessage;
  return websocket;
}

const logInfo = function (m, o) {
  if (initConfig !== null && initConfig.logLevel === "info") {
    console.log(getName() + ":" + m, o);
  }
};
const logError = function (m, o) {
  console.error(m, o);
};

const getName = function () {
  return initConfig === null || initConfig.name === undefined
    ? ""
    : initConfig.name;
};

const createWebSocket = function (config) {
  initConfig = config === undefined ? initConfig : config;
  if (initConfig === null) {
    logError("配置信息错误", e);
    throw new Error("配置信息错误");
  }
  try {
    initWebSocket(); //初始化websocket连接
  } catch (e) {
    logInfo("尝试创建连接失败", e);
    reConnect(); //如果无法连接上webSocket 那么重新连接！可能会因为服务器重新部署，或者短暂断网等导致无法创建连接
  }
};

//定义重连函数
const reConnect = function () {
  logInfo("尝试重新连接");
  if (isConnect) return; //如果已经连上就不在重连了
  reconnectTimer && clearTimeout(reconnectTimer);
  reconnectTimer = setTimeout(function () {
    // 延迟5秒重连  避免过多次过频繁请求重连
    createWebSocket();
  }, 5000);
};
//设置关闭连接
const closeWebSocket = function () {
  webSocket.close();
  isConnect = false;
};

// 创建 websocket 连接
function websocketOpen(e) {
  logInfo("WebSocket连接成功", e);
  isConnect = true;
  heartCheck.start();
  if (initConfig.onOpen !== undefined) {
    initConfig.onOpen(e);
  }
}

// 关闭
function websocketClose(e) {
  logInfo("WebSocket链接关闭", e);
  isConnect = false; //断开后修改标识
  reConnect();
  if (initConfig.onClose !== undefined) {
    initConfig.onClose(e);
  }
}

function websocketOnerror() {
  logInfo("WebSocket连接发生错误");
  isConnect = false; //连接断开修改标识
  heartCheck.stop();
  reConnect(); //连接错误 需要重连
  if (initConfig.onError !== undefined) {
    initConfig.onError(e);
  }
}

// 数据接收
function websocketOnmessage(e) {
  if (!e) {
    heartCheck.reset();
    return;
  }
  if (!e.data) {
    return;
  }
  logInfo("收到", e.data);
  if (initConfig.onMessage !== undefined) {
    initConfig.onMessage(e.data);
  }
}

// 数据发送
function websocketSend(message) {
  websocket.send(message);
}

export default {
  create: createWebSocket,
  close: closeWebSocket,
  send: websocketSend,
};
